package com.terren.spider.util.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * 主方法为createReportExcel(List<T> dataList) ，传入一个的list即可
 */
public class ExcelUtil<T> {

	public static String excelSuffix = ".xlsx";
	/** 导出excel文件的路径 **/
	public static String outsidePath="d://";
	public String excelPath;

	public ExcelUtil() {
		excelPath = outsidePath+ "/export/";
		FileUtil.mkdirs(excelPath);
	}

	/**
	 * 结果写入excel文件
	 * 
	 * @param excelBook
	 */
	public File writeFile(XSSFWorkbook excelBook) throws Exception {
		File excelFile = null;
		FileOutputStream out = null;
		try {
			String excelName = CommonUtil.getSingleId();

			String excelPath = this.excelPath + excelName + excelSuffix;

			excelFile = new File(excelPath);

			if (excelFile.exists()) {
				excelFile.delete();
			}

			out = new FileOutputStream(excelFile);
			excelBook.write(out);
			out.close();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return excelFile;
	}

	/**
	 * 主方法，传入一个对象的list即可
	 * 
	 * @param dataList
	 */
	public String createReportExcel(List<T> dataList) throws Exception {
		
		/** 创建Excel的工作书册 Workbook,对应到一个excel文档 **/
		XSSFWorkbook excelBook = new XSSFWorkbook();

		/** 创建Excel的工作sheet,对应到一个excel文档的tab **/
		XSSFSheet sheet = excelBook.createSheet("sheet1");

		/** 设置excel每列宽度 **/
		// sheet.setColumnWidth(0, 5000);

		/** 创建单元格样式，居中 **/
		XSSFCellStyle style = excelBook.createCellStyle();
		style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);

		/**
		 * ============================== 第一行 标题 ==============================
		 **/
		/** 创建Excel的sheet的一行 **/
		XSSFRow row = sheet.createRow(0);

		/** 创建一个Excel的单元格 **/
		XSSFRichTextString stringValue = null;

		XSSFCell cell = null;
		Integer i = 0;
		//添加列名，默认为数据库的字段名
		Field[] fields = dataList.get(0).getClass().getDeclaredFields();
		for (Field f : fields) {
			cell = row.createCell(i++);
			cell.setCellStyle(style);
			stringValue = new XSSFRichTextString(f.getName().toString());
			cell.setCellValue(stringValue);
		}

		/**
		 * ============================== 第二行 数据 ==============================
		 **/
		if (dataList == null || dataList.isEmpty()) {// 无结果
			/** 新的一行 **/
			row = sheet.createRow(1);

			/** ==================== 列 ==================== **/
			cell = row.createCell(0);
			stringValue = new XSSFRichTextString("无结果");
			cell.setCellValue(stringValue);
		} else {
			for (int i1 = 0; i1 < dataList.size(); i1++) {
				int number = i1 + 1;

				T pojo = dataList.get(i1);
				/** 新的一行 **/
				row = sheet.createRow(number);

				Field[] fields1 = dataList.get(0).getClass().getDeclaredFields();
				Integer j = 0;
				for (Field f : fields1) {
					if (!getMethodName(f.getName()).equalsIgnoreCase("SerialVersionUID")) {//把实体类中没有get，set方法的属性排除掉
					Method m = (Method) pojo.getClass().getMethod("get" + getMethodName(f.getName()));
					
					/** ==================== 列 ==================== **/
					/** 1列 **/
					cell = row.createCell(j++);
					cell.setCellStyle(style);
					if (m.invoke(pojo)!=""&&m.invoke(pojo)!=null) {
						if (f.getGenericType().toString().equals("class java.lang.String")) { 
							cell.setCellValue((String) m.invoke(pojo));
						}else if (f.getGenericType().toString().equals("class java.lang.Long")) { 
							cell.setCellValue((Long) m.invoke(pojo));
						}else if (f.getGenericType().toString().equals("class java.lang.Integer")) { 
							cell.setCellValue((Integer) m.invoke(pojo));
						}else if (f.getGenericType().toString().equals("class java.lang.Boolean")) { 
							cell.setCellValue((Boolean) m.invoke(pojo));
						}else if (f.getGenericType().toString().equals("class java.lang.Short")) { 
							cell.setCellValue((Short) m.invoke(pojo));
						}//类型不够的话，再自己添加吧
					}
					}
					
				}

			}
		}

		File excelFile = writeFile(excelBook);
		String excelPath = excelFile.getAbsolutePath();
		return excelPath;
	}

	private static String getMethodName(String fildeName) throws Exception {
		byte[] items = fildeName.getBytes();
		items[0] = (byte) ((char) items[0] - 'a' + 'A');
		return new String(items);
	}

}
